package com.example.demo.pdf;


import com.itextpdf.text.BaseColor;
import com.lowagie.text.*;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.util.IOUtils;
import org.springframework.core.io.ClassPathResource;

import java.awt.*;
import java.io.IOException;
import java.io.InputStream;

/**
 * 设置页面附加属性
 */
public class PDFBuilder extends PdfPageEventHelper {

    /**
     * 页眉描述
     */
    private String header = "SRC科研协作平台";

    /**
     * 水印图片地址
     */
    private String waterImgPath;

    /**
     * 水印内容
     */
    private String waterContent;

    /**
     * 文档字体大小，页脚页眉最好和文本大小一致
     */
    private int presentFontSize = 12;

    // 基础字体对象
    private BaseFont bf = null;

    // 利用基础字体生成的字体对象，一般用于生成中文文字
    private Font fontDetail = null;

    /**
     * Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
     */
    public PDFBuilder() {

    }

    public PDFBuilder(String fontFilePath, String waterImgPath, String waterContent) {
        try {
            if (StringUtils.isNotBlank(fontFilePath)) {
                // 设置文字中文字体
                this.bf = BaseFont.createFont(fontFilePath + ",1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED, false);
                this.fontDetail = new Font(this.bf, presentFontSize, Font.NORMAL);
            } else {
                //设置分页页眉页脚字体
                if (bf == null) {
                    bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
                }
                if (fontDetail == null) {
                    fontDetail = new Font(bf, presentFontSize, Font.NORMAL); // 数据体字体
                }
            }
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        }
        this.waterImgPath = waterImgPath;
        this.waterContent = waterContent;
    }

    public void setHeader(String header) {
        this.header = header;
    }

    public void setPresentFontSize(int presentFontSize) {
        this.presentFontSize = presentFontSize;
    }

    /**
     * 文档打开时
     */
    @Override
    public void onOpenDocument(PdfWriter writer, Document document) {
    }

    /**
     * 关闭每页的时候，写入页眉，写入'第几页'这几个字。
     *
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter,
     * com.itextpdf.text.Document)
     */
    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        this.addPageHeaderFooter(writer, document);
        this.addWatermark(writer, document);
    }

    // 添加页眉页脚
    private void addPageHeaderFooter(PdfWriter writer, Document document) {
        int pageS = writer.getPageNumber();
        if (pageS != 1) { // 封面不展示页眉页脚
            pageS = pageS - 1;

            float len1 = bf.getWidthPoint(header, presentFontSize);
            // 1.写入页眉
            ColumnText.showTextAligned(writer.getDirectContent(),
                    Element.ALIGN_CENTER, new Phrase(header, fontDetail),
                    (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len1) / 2.0F + 23F, document.top() - 25, 0);

            // 2.写入页脚
            // 2.写入 第 X 页
            String foot = "第 " + pageS + " 页";
            Phrase footer = new Phrase(foot, fontDetail);

            // 3.计算前半部分的foot1的长度，后面好定位最后一部分的'Y页'这俩字的x轴坐标，字体长度也要计算进去 = len
            float len = bf.getWidthPoint(foot, presentFontSize);

            // 4.拿到当前的PdfContentByte
            PdfContentByte cb = writer.getDirectContent();

            // 5.写入页脚1，x轴就是(右margin+左margin + right() -left()- len)/2.0F
            // 再给偏移20F适合人类视觉感受，否则肉眼看上去就太偏左了
            // ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了；注意Y轴是从下往上累加的，最上方的Top值是大于Bottom好几百开外的。
            ColumnText.showTextAligned(cb,
                    Element.ALIGN_CENTER,
                    footer,
                    (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F + 20F,
                    document.bottom() + 15, 0);
        }
    }

    // 添加水印
    public void addWatermark(PdfWriter writer, Document document) {
        try {
            // 水印图片
            Image waterImg = null;
            if (StringUtils.isNotBlank(waterImgPath)) {
                InputStream inputStream = new ClassPathResource(waterImgPath).getInputStream();
                waterImg = Image.getInstance(IOUtils.toByteArray(inputStream));
            }
            PdfContentByte pdfContent = writer.getDirectContent();
            // 开始写入水印
            pdfContent.beginText();
            // 设置水印透明度
            PdfGState gs = new PdfGState();
            // 水印透明度
            gs.setFillOpacity(1f);
            pdfContent.setGState(gs);
            // 文字水印
            pdfContent.setColorFill(Color.LIGHT_GRAY);
            // 字体大小
            pdfContent.setFontAndSize(bf, presentFontSize);
            // showTextAligned 方法的参数分别是（文字对齐方式，位置内容，输出水印X轴位置，Y轴位置，旋转角度）
            pdfContent.showTextAligned(Element.ALIGN_LEFT, waterContent, document.right() - 170, document.bottom() + 15, 0);

            int length = waterContent.length();
            // 图片水印
            if (waterImg != null) {
                // 设置坐标 绝对位置 X Y
                waterImg.setAbsolutePosition(document.right() - (180 + length), document.bottom() + 10);
                // 设置旋转弧度
                waterImg.setRotation(0);// 旋转 弧度
                // 设置旋转角度
                waterImg.setRotationDegrees(0);// 旋转 角度
                // 设置等比缩放
                waterImg.scaleAbsolute(20, 20);// 自定义大小
                // 写入图片水印
                pdfContent.addImage(waterImg);
            }
            // 结束写入水印
            pdfContent.endText();
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭文档时
     */
    public void onCloseDocument(PdfWriter writer, Document document) {
    }
}
